﻿#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug()<<"available drivers:";
//    //查看可用的驱动器
//    QStringList drivers = QSqlDatabase::drivers();
//    foreach(QString driver, drivers)
//    qDebug()<<driver;


    //建立数据库链接
    connection();

    //QSqlTableMode绑定数据库
    pModel = new QSqlTableModel(this, sqldb);

    //QSqlTableMode初始化
    MainWindow::initial_tablemode();

    //QTableView绑定QSqlTableMode
    ui->tableView->setModel(pModel);

    //QTableView初始化
    MainWindow::initial_tableview();

    //修改操作
    connect(ui->btn_updata,&QPushButton::clicked,this,&MainWindow::updata);

    //添加操作
    connect(ui->btn_insert,&QPushButton::clicked,this,&MainWindow::insert);

    //查询操作
    connect(ui->btn_select,&QPushButton::clicked,this,&MainWindow::selection);


    //删除操作
    connect(ui->btn_delete,&QPushButton::clicked,this,&MainWindow::mydelete);

    //退出操作
    connect(ui->btn_quit,&QPushButton::clicked,this,&QWidget::close);

}

/************************************
 * function        connection
 * destription     建立数据库链接
 * input           0
 * return          void
************************************/
void MainWindow::connection()
{
    sqldb = QSqlDatabase::addDatabase("QMYSQL");
    sqldb.setHostName("localhost");
    sqldb.setDatabaseName("team");
    sqldb.setUserName("root");
    sqldb.setPassword("199853");
    if (!sqldb.open())
    {
        QMessageBox::critical(this,"error", sqldb.lastError().text(),QMessageBox::Cancel);
    }

}


/************************************
 * function        initial
 * destription     初始化QSqlTableMode，设置格式
 * input           0
 * return          void
************************************/
void MainWindow::initial_tablemode()
{
    //选择表
    pModel->setTable("roster");
    //设置表头
    pModel->setHeaderData(0, Qt::Horizontal, QStringLiteral("编号"));
    pModel->setHeaderData(1, Qt::Horizontal, QStringLiteral("姓名"));
    pModel->setHeaderData(2, Qt::Horizontal, QStringLiteral("性别"));
    pModel->setHeaderData(3, Qt::Horizontal, QStringLiteral("年龄"));
    //选择模型     setEditStrategy
    //QSqlTableModel::OnFieldChange     对模型的所有更改将立即应用于数据库。
    //QSqlTableModel::OnRowChange       当用户选择其他行时，将应用对行的更改。
    //QSqlTableModel::OnManualSubmit    所有更改都将缓存在模型中，直到调用提交 All（） 或还原 All（）。
    pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    pModel->select();   //填充模型
    //pModel->sort(0, Qt::AscendingOrder); // 第0列升序排序
}


/************************************
 * function        initial
 * destription     初始化tableview，设置格式
 * input           0
 * return          void
************************************/
void MainWindow::initial_tableview()
{
    ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    //设置自动适应列宽
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //以行作为选择标准
    ui->tableView->setSelectionBehavior(QAbstractItemView::QAbstractItemView::SelectRows);
    //行头隐藏
    ui->tableView->verticalHeader()->hide();
//    // 让列头可被点击，触发点击事件
//    ui->tableView->horizontalHeader()->setSectionsClickable(true);
//    // 去掉选中表格时，列头的文字高亮
//    ui->tableView->horizontalHeader()->setHighlightSections(false);
//    ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Background);
    // 列头灰色
    ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background-color:rgb(225,225,225)};");
    connect(ui->tableView->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sortByColumn(int)));
}


/************************************
 * function        selection
 * destription     显示查询内容
 * input           0
 * return          void
************************************/
void MainWindow::selection()
{
    if(!ui->lineEdit->text().isEmpty())//搜索栏为空则不执行操作
    {
        pModel->setFilter("num ='"+ui->lineEdit->text()+"'");//pmodel过滤表中符合的数据
    }
    else
    {
        pModel->setFilter("");//若为空则显示全部
    }
    pModel->select();//显示修改后的数据
}


/************************************
 * function        insert
 * destription     添加信息，用于槽函数
 * input           0
 * return          void
************************************/
void MainWindow::insert()
{
    Dialog dialog(this);
    dialog.exec();
    QSqlRecord record = pModel->record();
    record.setValue(0, dialog.nun);
    record.setValue(1, dialog.name);
    record.setValue(2, dialog.sex);
    record.setValue(3, dialog.age);
    pModel->insertRecord(pModel->rowCount(), record);
    // 每次手动提交，都会重新刷新tableView，保持mode和tableView一致
    if (!pModel->submitAll())
    {
        QMessageBox::critical(this,"error", QStringLiteral("添加失败"),QMessageBox::Cancel);
        pModel->revertAll();
    }
    else
    {
        QMessageBox::information(this,"succse", QStringLiteral("添加成功"),QMessageBox::Ok);
    }

}


/************************************
 * function        updata
 * destription     修改数据，用于槽函数
 * input           0
 * return          void
************************************/
void MainWindow::updata()
{
    pModel->database().transaction();     //开始事务操作
    if (pModel->submitAll())              // 提交所有被修改的数据提交到数据库中
    {
        pModel->database().commit();      //提交成功，事务将真正修改数据库数据
    } else {
        pModel->database().rollback();    //提交失败，事务回滚
        QMessageBox::warning(this, tr("tableModel"),tr("error: %1").arg(pModel->lastError().text()));
    }
    pModel->revertAll(); //撤销修改
}


/************************************
 * function        mydelete
 * destription     删除数据
 * input           0
 * return          void
************************************/
void MainWindow::mydelete()
{
    pModel->removeRow(ui->tableView->currentIndex().row());
    // 每次手动提交，都会重新刷新tableView，保持mode和tableView一致
    pModel->submitAll();
}


MainWindow::~MainWindow()
{
    //关闭数据库
    sqldb.close();
    delete ui;
}
